/**
 * API密钥管理工具
 * 负责加载、验证和存储API密钥
 */

// 存储键名
const ZHIPU_API_KEY_STORAGE = 'zhipu_api_key';

/**
 * 从本地存储加载API密钥
 * @returns {string} 加载的API密钥，若不存在则返回默认密钥
 */
function loadApiKey(defaultKey) {
  if (!defaultKey) defaultKey = '';
  
  try {
    const storedKey = wx.getStorageSync(ZHIPU_API_KEY_STORAGE);
    if (storedKey) {
      console.log('已从本地存储加载API密钥');
      return storedKey;
    }
    
    if (defaultKey) {
      saveApiKey(defaultKey);
      return defaultKey;
    }
    
    return '';
  } catch (error) {
    console.error('加载API密钥出错:', error);
    return defaultKey || '';
  }
}

/**
 * 保存API密钥到本地存储
 * @param {string} apiKey 要保存的API密钥
 */
function saveApiKey(apiKey) {
  try {
    wx.setStorageSync(ZHIPU_API_KEY_STORAGE, apiKey);
    console.log('API密钥已保存至本地存储');
  } catch (error) {
    console.error('保存API密钥失败:', error);
  }
}

/**
 * 验证API密钥格式是否有效
 * @param {string} apiKey 要验证的API密钥
 * @returns {boolean} 密钥格式是否有效
 */
function validateApiKeyFormat(apiKey) {
  if (!apiKey) return false;
  
  // 智谱AI的API密钥格式通常为: id.secret
  const parts = apiKey.split('.');
  if (parts.length !== 2) return false;
  
  const id = parts[0];
  const secret = parts[1];
  
  // ID部分通常是32个字符的十六进制
  if (!/^[a-f0-9]{32}$/i.test(id)) return false;
  
  // Secret部分长度应该符合要求
  if (secret.length < 8) return false;
  
  return true;
}

/**
 * 测试API密钥是否能正常工作
 * @param {string} apiKey API密钥
 * @param {function} callback 测试完成回调函数(isValid, errorMsg)
 */
function testApiKey(apiKey, callback) {
  // 首先验证格式
  if (!validateApiKeyFormat(apiKey)) {
    callback(false, '密钥格式无效，应为"id.secret"格式');
    return;
  }
  
  // 导入智谱AI模块
  const zhipuAI = require('./zhipu_ai');
  
  // 使用一个简单请求测试API密钥
  zhipuAI.callZhipuAPI(
    [{ role: 'user', content: '你好，这是API密钥测试' }],
    {
      apiKey: apiKey,
      model: 'glm-4-air-250414',
      fallbackToMock: false, // 测试时不使用模拟数据回退
      onSuccess: function(response) {
        console.log('API密钥测试成功');
        saveApiKey(apiKey); // 测试成功，保存密钥
        callback(true, '');
      },
      onError: function(errorMsg, errorData) {
        console.error('API密钥测试失败:', errorMsg);
        
        // 特殊处理401错误(令牌验证失败)
        if (errorMsg.includes('401') || (errorData && errorData.code === "401")) {
          callback(false, '令牌验证失败，请确认密钥格式正确且未过期');
        } else {
          callback(false, errorMsg);
        }
      }
    }
  ).catch(function(err) {
    console.error('API密钥测试异常:', err);
    callback(false, err.message || '未知错误');
  });
}

// 导出API密钥管理函数
module.exports = {
  loadApiKey,
  saveApiKey,
  validateApiKeyFormat,
  testApiKey
}; 